package com.suiwei.advanced.collection;

import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;

import java.util.List;

//泛型

@Slf4j
public class GenericDemo{
    @Test
    void test(){
        Student<String> stu = new Student();
        testStatic("123");
        testStatic(123);
    }
    //泛型类：创建对象的时候确定类型
    class Student<E>{
        private E e;
        public E getE() {
            return e;
        }
        //非静态方法泛型：内部的泛型会根据类的泛型去匹配，创建对象的时候确定类型
        public void setE(E e) {
            this.e = e;
        }
    }
    //静态方法的泛型：调用方法的时候确定类型，调用方传什么类型就是什么类型
    //需要在Static后面声明泛型，不能用类的泛型
    public static<T>  void testStatic(T t){
        System.out.println(t);
    }

    //接口泛型:实现类实现接口的时候，确定的具体类型（实现类也可以不指定类型，继续用泛型，等实现类创建对象的时候再确认）
    interface inter<E>{
        void show(E e);
    }
    class interImpl implements inter<String>{
        @Override
        public void show(String s) {

        }
    }
    class interImpl2<E> implements inter<E>{
        @Override
        public void show(E s) {

        }
    }

    //通配符
    private void  test2(List<?> list){
        list.forEach(
            li -> {
              System.out.println(li);
            });
    }

}
